﻿<!DOCTYPE html>
<html>

<head>
  <meta http-equiv="Content-Type" content="application/hta; charset=UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=EmulateIE7">
  <hta:application id="oHTA" border="none" caption="no" contextmenu="no" selection="no" icon="splash.ico" innerborder="no"
    navigable="yes" showintaskbar="yes" scroll="no" version="1.0.0.0" />
  <title>[ЗаголовокЗаставки]</title>
  <script language="javascript" src="helpers.js"></script>
  <script language="javascript" src="main.js"></script>
  <script language="javascript">

    var windowWidth = 604
    var windowHeight = 324
    var windowLeft = 200
    var windowTop = 100
    if (window.screen) {
      windowLeft = (window.screen.availWidth - windowWidth) / 2
      windowTop = (window.screen.availHeight - windowHeight) / 2
    }
    window.moveTo(windowLeft, windowTop)
    window.resizeTo(windowWidth, windowHeight)

    // Переменные состояния
    var step = 0 // Текущий шаг процедуры обновления.
    var ret = 0 // Код возврата предыдущего шага.
    var finish = false
    var errStep = 0
    var loadStep = 10 // шаг начала загрузки первого файла обновления

    var endLoadStep = loadStep + cfgFileNames.length * 6 // следующий шаг после завершения загрузки файлов обновления
    if (cfgFileNames.length === 0) {
      endLoadStep = loadStep + 6
    }
    // Вывести сообщение о ходе обновления
    function setProgress (statusText) {
      statusText += '...'
      progressText.innerHTML = statusText
      log(statusText)
    }

    // Конечный автомат для выполнения шагов процедуры обновления конфигурации.
    function doStep (step) {
      switch (step) {
        case 0:
          setProgress('[Шаг1Инициализация]')
          break
        case 1:
          ret = initialize()
          break
        case 2:
          setProgress('[Шаг2ЗавершениеРаботы]')
          break
        case 3:
          ret = disconnectAndBlockUsersHTA()
          CollectGarbage()
          break
        case 4:
          if (createBackup) {
            setProgress('[Шаг3СозданиеРезервнойКопии]')
          }
          break
        case 5:
          ret = backupDB()
          break
        case 6:
          if (executeDeferredHandlers) {
            setProgress('[Шаг6ОтложенноеОбновление]')
          }
          break
        case 7:
          ret = runDeferredHandlers()
          break
        case 8:
          setProgress('[Шаг11УдалениеПатчей]')
          break
        case 9:
          ret = DeletePatches()
          break
        case endLoadStep:
          if (makeCompression) {
            setProgress('[Шаг7СжатиеТаблиц]')
          }
          break
        case endLoadStep + 1:
          ret = compressDB()
          break
        case endLoadStep + 2:
          setProgress('[Шаг8РазрешениеПодключений]')
          break
        case endLoadStep + 3:
          ret = allowConnections()
          break
        case endLoadStep + 4:
          setProgress('[Шаг9Завершение]')
          break
        case endLoadStep + 5:
          // Все готово.
          finalize(true)
          runEnterprise()
          self.close()
          ClearTempFiles()
          finish = true
          break
        default:
        {
          if ((step < loadStep) || (step >= endLoadStep)) {
            break
          }
          if (cfgFileNames.length === 0) {
            var internalStep = step - loadStep
            switch (internalStep) {
              case 0:
                setProgress('[Шаг4ОбновлениеКонфигурации]')
                break
              case 1:
                if (updateConfiguration){
                  ret = updateDbCfg()
                }
                break
              case 2:
                setProgress('[Шаг4ЗагрузкаРасширений]')
                break
              case 3:
                if (loadExtentions) {
                  ret = executeLoadExt()
                }
                break
              case 4:
                setProgress('[Шаг5ОбновлениеИБ]')
                break
              case 5:
                ret = executeUpdate(true)
                break
            }
            break
          }
          var cfgFileIndex = Math.floor((step - loadStep) / 6) // 0, 1, 2, 3, ...
          var internalStep = (step - loadStep) % 6
          var fileProperties = GetRequired(cfgFileNames[cfgFileIndex])
          var runHandlers = fileProperties.requiredVersion || (cfgFileIndex + 1 === cfgFileNames.length)
          switch (internalStep) {
            case 0:
              setProgress(format('[Шаг41Загрузка] ({0}/{1})', cfgFileIndex + 1, cfgFileNames.length))
              break
            case 1:
              var fileName = fileProperties.filePath
              ret = updateCfg(fileName)
              if (ret !== 0) {
                log('[СообщениеОтказОбновленияБазыИзФайла]')
                ret = loadCfg(fileName)
              }
              break
            case 2:
              setProgress(format('[Шаг42ОбновлениеКонфигурации] ({0}/{1})', cfgFileIndex + 1, cfgFileNames.length))
              break
            case 3:
              ret = updateDbCfg()
              break;
            case 4:
              if (runHandlers) {
                setProgress(format('[Шаг43ОбновлениеИБ] ({0}/{1})', cfgFileIndex + 1, cfgFileNames.length))
              }
              break
            case 5:
              if (runHandlers) {
                ret = executeUpdate(cfgFileIndex + 1 === cfgFileNames.length)
              }
              break
          }
          break
        }
      }
      return ret
    }

    // Выполнить процедуру обновления конфигурации
    function main () {
      if (finish) {
        return
      }
      
      document.getElementById('ProductNameText').innerHTML = '[НаименованиеПродукта]'
      document.getElementById('copyrightText').innerHTML = '[Копирайт]'
      
      // Если предыдущий шаг завершился неудачно...
      if (ret !== 0 && ret !== -1) {
        if (errStep === 0) {
          log(format('[СообщениеЗаставкиОшибкаШага]', ret), true)

          if (UseRestore) {
            setProgress('[Шаг10Восстановление]')
          } else {
            setProgress('[Шаг9Завершение]')
          }

          errStep++
          setTimeout('main()', 5) // Передача управления IE и повторный вызов main.
          return
        }
        finalize()
        runEnterprise(false)
        self.close()
        ClearTempFiles()
        finish = true
        return
      }

      // Последовательное выполнение шагов процедуры обновления.
      // При резервном копировании и отключении пользователей может быть необходимо повторить попытку.
      if (ret !== -1) {
        step++
      }
      doStep(step)

      // Передача управления IE и повторный вызов main через 1 секунду (достаточно для завершения COM-соединения).
      // Если еще не все сеансы завершены, то ret = -1 и ждем 18 секунд до следующей проверки.
      if (!finish) {
        setTimeout('main()', ret !== -1 ? 1000 : 18 * 1000)
      }
    }

    function checkClose () {
      if (!finish) {
        event.returnValue = format('[ПроцессПрерван]\n' +
              '[ПроцессПрерванПодсказка].')
      }
    }

    function ClearTempFiles () {
      // Удаляем временные файлы
      try {
        oFileSystemObject.DeleteFile(thisFileDir + '\\main.js')
        oFileSystemObject.DeleteFile(thisFileDir + '\\helpers.js')
        oFileSystemObject.DeleteFile(thisFileDir + '\\add-delete-patches.js')
        oFileSystemObject.DeleteFile(thisFileDir + '\\splash.png')
        oFileSystemObject.DeleteFile(thisFileDir + '\\splash.ico')
        oFileSystemObject.DeleteFile(thisFileDir + '\\progress.gif')
        oFileSystemObject.DeleteFile(thisFileDir + '\\splash.hta')
        oFileSystemObject.DeleteFile(thisFileDir + '\\templog.txt')
      } catch (e) { }
    }

  </script>
</head>

<body onload="window.setTimeout('main()',10);" style="border: 2px; background-image:url(splash.png); background-repeat: no-repeat; background-position: center center; background-attachment: fixed; background-color: #B3B3B3;">
  <div id="progressIcon" style="position: absolute; left: 10px; top: 65px;">
    <img src="progress.gif" border="0" />
  </div>
  <div id="captionText" style="font-size: 9pt; font-family: verdana,arial; font-weight: bold;
        color: #606060; position: absolute; left: 80px; top: 70px;">
    [ТекстЗаставки]
  </div>
  <div id="progressText" style="font-size: 8pt; font-family: verdana,arial; color: #000000;
        position: absolute; left: 10px; top: 240px;">
    &nbsp;
  </div>
  <div id="productNameText" style="font-size: 12pt; font-family: sans,sans-serif; color: #50525b; font-weight: bold;
        position: absolute; left: 20px; top: 270px;">
    &nbsp;
  </div>
  <div id="copyrightText" style="font-size: 8pt; font-family: sans,sans-serif; color: #9b9b9b; font-weight: bold;
        position: absolute; left: 20px; top: 290px;">
    &nbsp;
  </div>
</body>

</html>
